#include <iostream>
#include <unistd.h>
#include <signal.h>
using namespace std;
// 信号的处理是在内核态回到用户态的时候进行处理
// 调用系统接口，或者产生异常，进程由用户态转化为内核态（cpu的特定寄存器低两位会对进程所处状态进行标记）
// 当退出内核态今天用户态的时候，os扫描pading表，处理信号
void printpending(sigset_t &pending)
{
    for (int signo = 31; signo >= 1; signo--)
    {
        int n = sigismember(&pending, signo);
        if (n == 0)
        {
            cout << "0";
        }
        if (n == 1)
        {
            cout << "1";
        }
    }
    cout << "\n\n";
}

void handler(int signo)
{
    cout << "I get a signo :" << signo << endl;
}
int main()
{
    // 0、对2号新号捕捉
    signal(2, handler);
    // 1、对2号信号进行屏蔽
    sigset_t bset, obset;
    // 初始化block位图
    sigemptyset(&bset);
    sigemptyset(&obset);
    sigaddset(&bset, 2);

    // 将用户区block添加进进程pcb
    sigprocmask(SIG_SETMASK, &bset, &obset);

    // 2.打印panding
    sigset_t pending;
    int cnt = 0;
    while (true)
    {
        int n = sigpending(&pending);
        printpending(pending);
        if (n < 0)
        {
            continue;
        }
        sleep(1);
        cnt++;
        // 解除阻塞
        if (cnt == 20)
        {
            sigprocmask(SIG_SETMASK, &obset, NULL);

            // sigdelset(&bset, 2);
            // sigprocmask(SIG_SETMASK, &bset, &obset);
        }
    }
    // 发送2号信号
//return 0;
    return 0;
}